//package com.learning.db.function2;
//
//import org.apache.hadoop.conf.Configuration;
//import org.apache.hadoop.conf.Configured;
//import org.apache.hadoop.fs.Path;
//import org.apache.hadoop.io.LongWritable;
//import org.apache.hadoop.io.NullWritable;
//import org.apache.hadoop.io.Text;
//import org.apache.hadoop.mapreduce.Job;
//import org.apache.hadoop.mapreduce.Mapper;
//import org.apache.hadoop.mapreduce.Reducer;
//import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
//import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
//import org.apache.hadoop.util.Tool;
//import org.apache.hadoop.util.ToolRunner;
//
//import java.io.IOException;
//import java.util.Objects;
//import java.text.SimpleDateFormat;
//
///**
// * ClassName: LastJob
// * Description:
// * Date: 2018/3/28 20:26 【需求编号】
// *
// * @author Sam Sho
// * @version V1.0.0
// */
//public class LastJob extends Configured implements Tool {
//
//    /**
//     * 目录库 Mapper
//     */
//    static class LastMapper extends Mapper<LongWritable, Text, Text, Text> {
//
//        // 个人编号
//        private Text aac99 = new Text();
//
//        @Override
//        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//
//            // 获取每行数据的值
//            String lineValue = value.toString().trim();
//            // 按指定分隔符进行分割
//            String[] arr = lineValue.split("\\|");
//            aac99.set(arr[0]);
//            context.write(aac99, value);
//        }
//    }
//
//    static class LastReduce extends Reducer<Text, Text, JBean, NullWritable> {
//
//        /**
//         * 自负费用
//         * rate_of_Generalinsured~2-普通参保人员支付比例
//         */
//
//        double[][] rate_of_Generalinsured = {{0, 6000, 0, 800}, {6000, 10000, 0.3, 800},
//                {10000, 20000, 0.4, 2000}};
//
//        /**
//         * rateof_ownxpenseaddCompliance自负加合规费用
//         */
//        double[][] rateof_ownaddCompliance = {{20000, 50000, 0.5, 0}, {50000, 100000, 0.6, 15000},
//                {100000, 200000, 0.7, 45000}, {200000, Double.MAX_VALUE, 0.8, 115000}};
//
//        /**
//         * 自负费用
//         * rateof_Realtimerescue实时救助人员支付比例
//         */
//        double[][] rateof_Realtimerescue_1 = {{0.0000, 3000.0000, 0.0000, 800.0000}, {3000.0000, 6000.0000, 0.3500, 800.0000},
//                {6000.0000, 10000.0000, 0.3500, 1850.0000}, {10000.0000, 20000.0000, 0.4500, 3250.0000}};
//
//        double[][] rateof_Realtimerescue_2 = {{20000.0000, 50000.0000, 0.5500, 0.0000}, {50000.0000, 100000.0000, 0.6500, 16500.0000},
//                {100000.0000, 200000.0000, 0.7500, 49000.0000}, {200000.0000, 9999999999.9900, 0.8500, 124000.0000}};
//        int i = 0;
//
//        @Override
//        protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
//            System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + key.toString());
//            System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  " + i++ + " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
//
//            double sum_OwnExpense = 0;//累计自负金额
//            double sum_Compliance = 0;//累计合规费用
//            double sum_OwnExpense_add_sum_Compliance = 0;//累计自负费用+累计合规费用
//            double sum_POwnExpense = 0;//累计自负赔付
//            double sum_POwnExpense_add_Compliance = 0;//累计自负加合规赔付
//            JBean bean = new JBean();
//            for (Text value : values) {
//                String lineValue = value.toString().trim();
//                String[] arr = lineValue.split("\\|");
//
//                // 个人编号
//                String PersonId = arr[0];
//
//                // 医疗结算事件id
//                String MedicalId = arr[1];
//
//                // 自负金额
//                String SownExpense = arr[2];
//                double OwnExpense = Objects.equals("\\\\N", SownExpense) ? 0 : Double.parseDouble(SownExpense);
//
//                // 自费金额
//                String OwnCost = arr[3];
//
//                // 其中救助基金（自费）
//                String Salvagefund = arr[4];
//
//                // 自理金额
//                String SelfCare = arr[5];
//
//                // 累计合规费用
//                String SumDetail = arr[6];
//
//                //  取小后的本次合规自费费用
//                String Compliance = arr[7];
//                double tCompliance = Objects.equals("\\\\N", Compliance) ? 0 : Double.parseDouble(Compliance);
//
//
//                // 自负+ 计算后的合规 费用
//                String OwnExpense_add_Compliance = arr[8];
//                double dOwnExpense_add_Compliance = Objects.equals("\\\\N", OwnExpense_add_Compliance) ? 0 : Double.parseDouble(OwnExpense_add_Compliance);
//
//                // 救助标识
//                String SlaveFlag = arr[9];
//
//                //结算日期
//                String SettlementDate = arr[10];
//
//
//                // 自负金额 赔付费用
//                double money = 0.0;
//                double money2 = 0.0;
//
//                // 普通
//                if (Objects.equals("\\\\N", SlaveFlag) || Objects.equals("无效", SlaveFlag)) {
//
//                    //
//                    if (OwnExpense > 20000) {
//                        money = 6000;
//                    } else if (OwnExpense < 6000) {
//                        money = 0;
//                    } else {
//                        for (double[] doubles : rate_of_Generalinsured) {
//                            if (OwnExpense > doubles[0] && OwnExpense <= doubles[1]) {
//                                money = (OwnExpense - doubles[0]) * doubles[2] + doubles[3];
//                                break;
//                            }
//                        }
//                    }
//
//                    // 自负+ 计算后的合规 赔付费用
//                    if (dOwnExpense_add_Compliance <= 20000) {
//                        money2 = 0;
//                    } else {
//                        for (double[] doubles : rateof_ownaddCompliance) {
//                            if (dOwnExpense_add_Compliance > doubles[0] && dOwnExpense_add_Compliance <= doubles[1]) {
//                                money2 = (dOwnExpense_add_Compliance - doubles[0]) * doubles[2] + doubles[3];
//                                break;
//                            }
//                        }
//                    }
//                    // 救助
//                } else {
//
//                    if (OwnExpense > 20000) {
//                        money = 7750;
//                    } else if (OwnExpense < 3000) {
//                        money = 0;
//                    } else {
//                        for (double[] doubles : rateof_Realtimerescue_1) {
//                            if (OwnExpense > doubles[0] && OwnExpense <= doubles[1]) {
//                                money = (OwnExpense - doubles[0]) * doubles[2] + doubles[3];
//                                break;
//                            }
//                        }
//                    }
//
//                    // 自负+ 计算后的合规 赔付费用
//                    if (dOwnExpense_add_Compliance <= 20000) {
//                        money2 = 0;
//                    } else {
//                        for (double[] doubles : rateof_Realtimerescue_2) {
//                            if (dOwnExpense_add_Compliance > doubles[0] && dOwnExpense_add_Compliance <= doubles[1]) {
//                                money2 = (dOwnExpense_add_Compliance - doubles[0]) * doubles[2] + doubles[3];
//                                break;
//                            }
//                        }
//                    }
//                }
//
//                sum_Compliance = sum_Compliance + tCompliance;
//                sum_OwnExpense = sum_OwnExpense + OwnExpense;//累计自负金额
//                sum_POwnExpense = sum_POwnExpense + money;//累计自负赔付
//                sum_POwnExpense_add_Compliance = sum_POwnExpense_add_Compliance + money2;//累计自负加合规赔付
//                sum_OwnExpense_add_sum_Compliance=sum_OwnExpense + sum_Compliance;//累计自负费用+累计合规费用
//                //获取系统当前时间
//                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//                String tCurrentDate = df.format(System.currentTimeMillis());
//
//                bean.set(PersonId,MedicalId,SownExpense,String.valueOf(sum_OwnExpense),String.valueOf(money),String.valueOf(sum_POwnExpense),Compliance,String.valueOf(sum_Compliance),String.valueOf(sum_OwnExpense_add_sum_Compliance),String.valueOf(money2),String.valueOf(sum_POwnExpense_add_Compliance),SettlementDate,tCurrentDate,"1");
//
//                context.write(bean, NullWritable.get());
//            }
//        }
//    }
//
//
//    @Override
//    public int run(String[] args) throws Exception {
//        Configuration conf = getConf();
//        Job job = Job.getInstance(conf, LastJob.class.getSimpleName());
//        job.setJarByClass(LastJob.class);
//
//        FileInputFormat.addInputPath(job, new Path(args[0]));
//        FileOutputFormat.setOutputPath(job, new Path(args[1]));
//
//        // map settings
//        job.setMapperClass(LastMapper.class);
//        job.setMapOutputKeyClass(Text.class);
//        job.setMapOutputValueClass(Text.class);
//
//        // reduce settings
//        job.setReducerClass(LastReduce.class);
//        job.setOutputKeyClass(JBean.class);
//        job.setOutputValueClass(NullWritable.class);
//
//        boolean res = job.waitForCompletion(true);
//
//        return res ? 0 : 1;
//    }
//
//    public static void main(String[] args) throws Exception {
//        Configuration configuration = new Configuration();
//        configuration.set("fs.defaultFS", "hdfs://newlistest02:9000");
//        System.setProperty("HADOOP_USER_NAME", "sinosoft");
//        args = new String[]{"/dbyb2/input/oneperson/testvalue1", "/dbyb2/output/oneperson/out006.txt"};
//
//        if (args.length < 1) {
//            return;
//        }
//
//        ToolRunner.run(configuration, new LastJob(), args);
//    }
//}
